using System;
namespace ch.ethz.ssh2.packets
{
	
	/// <summary> PacketChannelOpenConfirmation.
	/// 
	/// </summary>
	/// <author>  Christian Plattner
	/// </author>
	/// <version>  2.50, 03/15/10
	/// </version>
	public class PacketChannelOpenConfirmation
	{
		virtual public byte[] Payload
		{
			get
			{
				if (payload == null)
				{
					TypesWriter tw = new TypesWriter();
					tw.writeByte(Packets.SSH_MSG_CHANNEL_OPEN_CONFIRMATION);
					tw.writeUINT32(recipientChannelID);
					tw.writeUINT32(senderChannelID);
					tw.writeUINT32(initialWindowSize);
					tw.writeUINT32(maxPacketSize);
					payload = tw.getBytes();
				}
				return payload;
			}
			
		}
		internal byte[] payload;
		
		public int recipientChannelID;
		public int senderChannelID;
		public int initialWindowSize;
		public int maxPacketSize;
		
		public PacketChannelOpenConfirmation(int recipientChannelID, int senderChannelID, int initialWindowSize, int maxPacketSize)
		{
			this.recipientChannelID = recipientChannelID;
			this.senderChannelID = senderChannelID;
			this.initialWindowSize = initialWindowSize;
			this.maxPacketSize = maxPacketSize;
		}
		
		public PacketChannelOpenConfirmation(byte[] payload, int off, int len)
		{
			this.payload = new byte[len];
			Array.Copy(payload, off, this.payload, 0, len);
			
			TypesReader tr = new TypesReader(payload, off, len);
			
			int packet_type = tr.readByte();
			
			if (packet_type != Packets.SSH_MSG_CHANNEL_OPEN_CONFIRMATION)
				throw new System.IO.IOException("This is not a SSH_MSG_CHANNEL_OPEN_CONFIRMATION! (" + packet_type + ")");
			
			recipientChannelID = tr.readUINT32();
			senderChannelID = tr.readUINT32();
			initialWindowSize = tr.readUINT32();
			maxPacketSize = tr.readUINT32();
			
			if (tr.remain() != 0)
				throw new System.IO.IOException("Padding in SSH_MSG_CHANNEL_OPEN_CONFIRMATION packet!");
		}
	}
}